DV 29 - vRefNum Ç©ÇÁéÊìæÇ∑ÇÈ SCSI ID

(çXêVì˙: 97 îN 5 åé 23 ì˙)

Q: ì¡íËÇÃÉtÉ@ÉCÉãÇä‹ÇfiÉfÉBÉXÉNÉ{ÉäÉÖÅ[ÉÄÇà SCSI IDÇéÊìæÇµÇΩÇ¢ÇÃÇ≈Ç∑Ç™ÅAÇ«ÇÒÇ»ï˚ñ@ǙdžÇÈÇ≈ǵÇÂǧǩÅB

A: DZDZÇ≈ÇÕÅAëŒè€ÇΔÇ»ÇÈÉhÉâÉCÉuÇ™ SCSI Ç≈ǻǢ (ÉtÉçÉbÉsÅ[ÅAIDEÅARAM ÉfÉBÉXÉNǻǫ) èÍçáLJå©âzǵǃê‡ñæÇçsǢNjÇ∑ÅB


SCSI Manager 4.3 Ç™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈǩǫǧǩÇ≈ÅADZÇÃéøñ‚Ç…ÇÕ 2 ǬÇÃâÒìöÇ™çlǶÇÁÇÍÇ‹Ç∑ÅBSCSI Manager 4.3 Ç™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢǻǢèÍçáÇÕÅASCSI ÉfÉoÉCÉXÇ™ÉÜÉjÉbÉgÉeÅ[ÉuÉãì‡ÇÃì¡íËÇÃèÍèäÇ…à íuÇ∑ÇÈÇΔǢǧéñé¿Ç…LJÇΔÇ√ǢǃëŒèàǵNjÇ∑ÅBÅwInside Macintosh:DevicesÅxÇóvñÒÇ∑ÇÈÇΔÅASCSI ÉhÉâÉCÉoÇÕÉÜÉjÉbÉgÉeÅ[ÉuÉãÇÃÉXÉçÉbÉg 32-40 Ç…èáÇ…ì¸ÇËÇ‹Ç∑ÅBDZÇÃÇΩÇflÅASCSI 0 Ç…ëŒÇ∑ÇÈÉhÉâÉCÉoÇÕÉXÉçÉbÉg 32ÅASCSI 1 Ç…ëŒÇ∑ÇÈÉhÉâÉCÉoÇÕÉXÉçÉbÉg 33ÅA... DždžÇËÇ‹Ç∑ÅB

slot number = -(refnum-1)

è„ÇÃéÆÇ…ÇÊÇËÅASCSI 0 Ç…ëŒÇ∑ÇÈÉhÉâÉCÉoÇÕ refnum -33ÅASCSI 1 Ç…ëŒÇ∑ÇÈÉhÉâÉCÉo refnum -34ÅA..... ÇéùÇøÇ‹Ç∑ÅB

SCSI Manager 4.3 Ç™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈèÍçáÇÕÅAÅwInside Macintosh:DevicesÅxÇà 4-52 Ç®ÇÊÇ— 4-53 ÉyÅ[ÉWÇÃê‡ñæÇ…ǵÇΩǙǡǃÅASCSILookupRefNumXRef() ÉãÅ[É`ÉìÇåƒÇ—èoǵNjÇ∑ÅB

SCSI Manager 4.3 Ç™ë∂ç›Ç∑ÇÈǩǫǧǩÇåüèoÇ∑ÇÈÇ…ÇÕÅAÅwInside Macintosh:Operating System UtilitiesÅxÇà 8-21 Ç©ÇÁ 8-23 ÉyÅ[ÉWÇÃó·Ç…ǵÇΩǙǡǃÅA_SCSIAtomic ÉgÉâÉbÉvÇ™ÉCÉìÉvÉäÉÅÉìÉgÇ≥ÇÍǃǢǻǢDZÇΔÇÉ`ÉFÉbÉNǵNjÇ∑ÅBÇ‹ÇΩÅAÅuTool Chest developer CDÅvÇÃÅgSCSI Samples 1.0ÅhÉtÉHÉãÉ_DždžÇÈ "I Am Curious SCSI" ÉmÅ[ÉgÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB

É{ÉäÉÖÅ[ÉÄÉäÉtÉ@ÉåÉìÉXî‘çÜÇ™ÇÌǩǡǃǢÇÈÇΔÇ∑ÇÈÇΔÅAÉhÉâÉCÉoÉäÉtÉ@ÉåÉìÉXî‘çÜÇéÊìæÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃèàóùÇçsǧDžÇÕÅAÅwInside Macintosh:FilesÅxÇà 2-144 ÉyÅ[ÉWÇÃê‡ñæÇ…ǵÇΩǙǡǃÅAPBHGetVInfo()ÇåƒÇ—èoǵNjÇ∑ÅB

OSErr GetDRefNumFromVRefNum(short vRefNum, short *dRefNum)
{
	HParamBlockRec pb;
	Str27 volName;
	OSErr result;

	pb.volumeParam.ioVRefNum = vRefNum;
	pb.volumeParam.ioNamePtr = volName;
	pb.volumeParam.ioVolIndex = 0; /* ioVRefNum ÇÃÇ›ÇégópǵÅA
						É{ÉäÉÖÅ[ÉÄñºÇï‘Ç∑ */ 
	result = PBHGetVInfoSync(&pb);
	if (result == noErr) *dRefNum = pb.volumeParam.ioVDrvInfo;

	return result;

}


ÉhÉâÉCÉoÉäÉtÉ@ÉåÉìÉXî‘çÜÇéÊìæÇ≈Ç´ÇΩÇÁÅA
éüÇÃÉRÅ[ÉhÇégǢNjÇ∑ ("I Am Curious SCSI" ÇÊÇË)ÅB

/* * ì¡íËÇÃÉhÉâÉCÉoÉäÉtÉ@ÉåÉìÉXî‘çÜÇ…ëŒÇ∑ÇÈ SCSI Bus ID ÇéÊìæÇ∑ÇÈÅB
DZÇÍÇÕÉIÉäÉWÉiÉãÇà SCSI Manager Ç…ëŒÇµÇƒóLå¯ÅBîÒìØä˙ SCSI Manager ÇÃèÍçáÇÕÅA
ÉhÉâÉCÉoÇÕ SCSI Manager Çégǡǃìoò^Ç≥ÇÍǃǢǻǢDZÇΔÇ™ïKóvÅB */

#define DriverRefNumToSCSI(x) ((signed short) (~(x) - 32))

/* * ìoò^Ç≥ÇÍǃǢÇÈÉfÉoÉCÉXÇÃÉäÉXÉgÇåüçıǵǃÅA
ì¡íËÇÃÉhÉâÉCÉoÇ…ëŒÇ∑ÇÈ DeviceIdent ÇéÊìæÇ∑ÇÈÅB
ê≥èÌÇ…èIóπÇ∑ÇÍÇŒ noErr Ç™ï‘Ç≥ÇÍÅAë∂ç›ÇµÇ»ÇØÇÍÇŒ nsvErr Ç™ï‘Ç≥ÇÍÇÈÅB */

OSErr DriverRefNumToDeviceID( short driverRefNum, 
				DeviceIdent *deviceIdentPtr ) 
{
	OSErr status, scsiStatus;
	SCSI_DriverPB pb;
	short targetID;

	status = nsvErr;

	if (AsynchronousSCSIManagerPresent()) { 

	/* * ìoò^Ç≥ÇÍǃǢÇÈÉhÉâÉCÉoÇÃÉäÉXÉgÇÉXÉLÉÉÉìǵǃÅA
	DZÇÃdriverRefNum Çå©Ç¬ÇØÇÈ */ 

		ClearMemory((ptr) &pb, sizeof pb);

		pb.scsiPBLength = sizeof (SCSI_Driver_PB);
		pb.scsiCompletion = NULL;
		pb.scsiFlags = 0;
		pb.scsiFunctionCode = SCSILookupRefNumXref;

	/* DeviceIdent ÇÃèâä˙ílÇΔǵǃ "ïsâ¬î\Ç»" ílÇê›íËǵǃÅA
	ÉXÉLÉÉÉìÉvÉçÉZÉXÇäJénÇ∑ÇÈÅB
	SCSIAction Ç…ÇÊÇËÅApb.scsiDevice Ç…åªç›ÇÃÉfÉoÉCÉXÇ™ï‘Ç≥ÇÍÅA
	pb.scsiNextDevice Ç…éüÇ…ìoò^Ç≥ÇÍǃǢÇÈÉfÉoÉCÉXÇ™ï‘Ç≥ÇÍÇÈÅB
	ÉãÅ[ÉvèàóùÇçsǧDZÇΔÇ≈ÅAìoò^Ç≥ÇÍǃǢÇÈäeÉfÉoÉCÉXÇèáéüåüç∏Ç≈Ç´ÇÈÅB
	éüÇÃÉfÉoÉCÉXÇ™ïsê≥Ç»ÉoÉXè„DždžÇÈÇΔÇ´ÇÕÉãÅ[ÉvÇî≤ÇØÇÈÅB
	ǻǮÅA"ïsê≥Ç»" ê›íËílÇä‹Çfiåªç›ÇÃÉoÉX (pb.scsiDevice.bus) ÇÃ
	ç≈èâÇÃílÇÕñ≥éãÇ∑ÇÈïKóvǙdžÇÈÅB */

		*((long *) &pb.scsiDevice) = -1L;

		do { scsiStatus = SCSIAction((SCSI_PB *) &pb);
		
			if (scsiStatus != noErr) {
				status = scsiStatus;
				break;
			}
			/* ñ⁄ìIÇÃÉhÉâÉCÉuÇ©? */ 
			if (pb.scsiDriver == driverRefNum
			/* DZÇÍÇÕñ{ìñÇÃÉoÉXÇ©? */
			&& pb.scsiDevice.bus != 0xFF) { 
				*deviceIdentPtr = pb.scsiDevice;
				status = noErr;
				break;
			}
			pb.scsiDevice = pb.scsiNextDevice;

		} while (pb.scsiDevice.bus != 0xFF);

	}
	if (status == nsvErr) {
	/* * îÒìØä˙ SCSI Manager ǙǻǢǩÅA
	ÉhÉâÉCÉoÇ™ SCSI Manager Çégǡǃìoò^Ç≥ÇÍǻǩǡÇΩÅB */
		targetID = DriverRefNumToSCSI(driverRefNum);
		
		if (targetID >= 0 && targetID <= 6) { 
			deviceIdentPtr->diReserved = 0;
			deviceIdentPtr->diBus = 0;
			deviceIdentPtr->targetID = targetID;
			deviceIdentPtr->LUN = 0;

			status = noErr;
		}

	} return (status);

}
--Brian Bechtel
devsupport@apple.com

[ Technical Q&A's : Devices : DV29 ]